package Reflect;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 34255
 * Date: 2024-10-15
 * Time: 15:52
 */
public class getMethod {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        //创建字节码文件对象
        Class<?> stuClass = Class.forName("Reflect.Student");

        //获取所有公有的方法  注意⚠️该方法除了会获取指定类的所有共有方法，还会获取父类所有的方法
//        Method[] methods = stuClass.getMethods();
//        for (Method method:methods) {
//            System.out.println(method);
//        }

        //获取某个共有的方法
        Method getAge = stuClass.getMethod("getAge");
        System.out.println(getAge);

        Student stu1 = new Student(22);

        //使用获取到的方法
        int age = stu1.getAge();
        System.out.println(age);

        //获取所有方法，不包括父类的，但是包含子类的私有方法
//        Method[] declaredMethods = stuClass.getDeclaredMethods();
//        for (Method method:declaredMethods) {
//            System.out.println(method);
//        }

        //获取某个方法，包括私有的方法
        Method setName = stuClass.getDeclaredMethod("setName",String.class);//"setName" , String.class,指定方法名及参数列表，避免方法重载

        //临时解除权限检查
        setName.setAccessible(true);

        setName.invoke(stu1,"陈达峰");//stu1为方法的调用者
        System.out.println(stu1);

    }
}
